namespace feng3d
{
    /**
     * 文件系统
     */
    export var fs: FS;

    /**
     * 文件系统
     * 
     * API仿照 NodeJs
     */
    export interface FS
    {
        /**
         * 异步stat(2) -获取文件状态。
         * 
         * @param path 文件的路径。
         * @param callback 完成回调。
         */
        stat(path: string, callback: (err: Error, stats: Stats) => void): void;

        /**
         * 异步链接(2)——创建到现有文件的新链接(也称为硬链接)。
         * 
         * @param existingPath 现有文件的路径。
         * @param newPath 文件的新路径。
         * @param callback 完成回调。
         */
        link(existingPath: string, newPath: string, callback: (err: Error) => void): void;

        /**
         * 异步重命名(2)-更改文件或目录的名称或位置。
         * 
         * @param oldPath 文件的旧路径。
         * @param newPath 文件的新路径。
         * @param callback 完成回调。
         */
        rename(oldPath: string, newPath: string, callback: (err: Error) => void): void;

        /**
         * 异步读取文件的全部内容。
         * 
         * @param path 文件的路径。
         * @param options 
         * @param callback 完成回调。
         */
        readFile(path: string, options: "utf8", callback: (err: Error, data: string) => void): void;

        /**
         * 异步地将数据写入文件，如果文件已经存在，则替换该文件。
         * 
         * @param path 文件的路径。
         * @param data 要写入的数据。如果提供的不是缓冲区或Uint8Array，则该值被强制转换为字符串。
         * @param callback 完成回调
         */
        writeFile(path: string, data: string, callback: (err: Error) => void): void;

        /**
         * 异步unlink(2) -删除一个名称，可能还包括它所引用的文件。
         * 
         * @param path 文件的路径。
         * @param callback 完成回调。
         */
        unlink(path: string, callback: (err: Error) => void): void;

        /**
         * 异步mkdir(2) -创建一个目录。
         * 
         * @param path 文件的路径。
         * @param callback 完成回调。
         */
        mkdir(path: string, callback: (err: Error) => void): void;

        /**
         * 异步readdir(3) -读取目录。
         * 
         * @param path 文件的路径。
         * @param callback 完成回调。
         */
        readdir(path: string, callback: (err: Error, files: string[]) => void): void;

        /**
         * 异步rmdir(2) -删除一个目录。
         * 
         * @param path 文件的路径。
         * @param callback 完成回调。
         */
        rmdir(path: string, callback: (err: Error) => void): void;
    }

    interface Stats
    {
        isFile(): boolean;
        isDirectory(): boolean;
        isBlockDevice(): boolean;
        isCharacterDevice(): boolean;
        isSymbolicLink(): boolean;
        isFIFO(): boolean;
        isSocket(): boolean;
        dev: number;
        ino: number;
        mode: number;
        nlink: number;
        uid: number;
        gid: number;
        rdev: number;
        size: number;
        blksize: number;
        blocks: number;
        atimeMs: number;
        mtimeMs: number;
        ctimeMs: number;
        birthtimeMs: number;
        atime: Date;
        mtime: Date;
        ctime: Date;
        birthtime: Date;
    }
}